{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### unittest框架"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 导入库"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "from selenium import webdriver\n",
    "from selenium.webdriver.chrome.service import Service\n",
    "from selenium.webdriver.chrome.options import Options\n",
    "import time\n",
    "import os\n",
    "from selenium.webdriver.common.by import By\n",
    "import unittest"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 1.先写一个简单的测试套件"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "..\n",
      "----------------------------------------------------------------------\n",
      "Ran 2 tests in 25.584s\n",
      "\n",
      "OK\n"
     ]
    }
   ],
   "source": [
    "\n",
    "class TestUnit1(unittest.TestCase):\n",
    "    # 获取浏览器的驱动\n",
    "    def setUp(self):\n",
    "        \n",
    "        # 指定 ChromeDriver 和 Chrome 浏览器路径\n",
    "        chrome_driver_path = \"F:/Google Chrome/chromedriver-win64/chromedriver.exe\"\n",
    "        chrome_binary_path = \"F:/Google Chrome/Google/Chrome/Application/chrome.exe\"\n",
    "\n",
    "        # 配置 Chrome 启动选项\n",
    "        options = Options()\n",
    "        options.binary_location = chrome_binary_path\n",
    "\n",
    "        # 创建服务对象并启动浏览器\n",
    "        service = Service(executable_path=chrome_driver_path)      \n",
    "        self.driver = webdriver.Chrome(service=service, options=options)\n",
    "\n",
    "        self.driver.maximize_window()\n",
    "        self.url = \"https://www.sogou.com/\"\n",
    "        self.driver.get(self.url)\n",
    "        time.sleep(3)\n",
    "\n",
    "    \n",
    "    # 测试用例的起名要用 test_\n",
    "    def test_search1(self):\n",
    "        self.driver.find_element(By.ID, \"query\").send_keys(\"浪浪山\")\n",
    "        self.driver.find_element(By.ID, \"stb\").click()\n",
    "        time.sleep(2)\n",
    "\n",
    "    \n",
    "    def test_search2(self):\n",
    "        self.driver.find_element(By.ID, \"query\").send_keys(\"捕风捉影\")\n",
    "        self.driver.find_element(By.ID, \"stb\").click()\n",
    "        time.sleep(2)\n",
    "\n",
    "    # 关闭浏览器\n",
    "    def tearDown(self):\n",
    "        self.driver.quit()\n",
    "\n",
    "if __name__==\"__main__\":\n",
    "    #unittest.main()  #默认是这个\n",
    "    unittest.main(argv=['first-arg-is-ignored'], exit=False) #避免解析 Jupyter 的参数\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "🧩 什么是测试套件？  \n",
    "测试套件是一个集合，里面包含了多个测试用例（test case），用于系统性地验证某个功能或模块是否按预期工作。\n",
    "\n",
    "✅ 你的代码中体现测试套件的结构：\n",
    "| 组成部分                        | 说明                                                                 |\n",
    "|-------------------------------|----------------------------------------------------------------------|\n",
    "| `class TestUnit1(unittest.TestCase)` | 定义了一个测试类，继承自 `unittest.TestCase`，这是测试套件的核心             |\n",
    "| `setUp()`                     | 每个测试用例运行前都会执行这个方法，用于初始化浏览器等资源                     |\n",
    "| `test_search1()` 和 `test_search2()` | 两个独立的测试用例，分别测试不同的搜索关键词                                 |\n",
    "| `tearDown()`                  | 每个测试用例运行后都会执行这个方法，用于清理资源                              |\n",
    "| `unittest.main()`            | 启动整个测试套件，自动发现并运行所有以 `test_` 开头的方法                      |\n",
    "\n",
    "\n",
    "----------------\n",
    "\n",
    "🧭 执行顺序概览（unittest 测试流程）  \n",
    "1. 启动测试框架  \n",
    "- 调用 unittest.main() 启动测试运行器。  \n",
    "2. 自动发现测试方法    \n",
    "- 查找所有继承自 unittest.TestCase 的类（如 TestUnit1）。  \n",
    "- 自动识别类中所有以 test_ 开头的方法。  \n",
    "3. 逐个执行测试方法  \n",
    "对于每个测试方法，执行顺序如下：\n",
    "\n",
    "- 🔧 setUp()：测试前的初始化操作\n",
    "\n",
    "- ✅ test_xxx()：实际的测试逻辑\n",
    "\n",
    "- 🧹 tearDown()：测试后的清理操作  \n",
    "4. 输出测试结果  \n",
    "显示每个测试的状态：\n",
    "\n",
    "- ✅ 成功（OK）\n",
    "\n",
    "- ❌ 失败（断言失败）\n",
    "\n",
    "- ⚠️ 错误（异常抛出）\n",
    "\n",
    "- ⏭️ 跳过（使用 @unittest.skip 装饰器）"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 2.两个套件"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### 搜狗测试1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "-----setUp-----\n",
      "-----tearDown-----\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "."
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "-----setUp-----\n",
      "突如其来的假期 - 搜狗搜索\n",
      "-----tearDown-----\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      ".\n",
      "----------------------------------------------------------------------\n",
      "Ran 2 tests in 29.321s\n",
      "\n",
      "OK\n"
     ]
    }
   ],
   "source": [
    "class Baidu1(unittest.TestCase):\n",
    "#     测试固件\n",
    "    def setUp(self):\n",
    "        print(\"-----setUp-----\")\n",
    "      \n",
    "       # 指定 ChromeDriver 和 Chrome 浏览器路径\n",
    "        chrome_driver_path = \"F:/Google Chrome/chromedriver-win64/chromedriver.exe\"\n",
    "        chrome_binary_path = \"F:/Google Chrome/Google/Chrome/Application/chrome.exe\"\n",
    "\n",
    "        # 配置 Chrome 启动选项\n",
    "        options = Options()\n",
    "        options.binary_location = chrome_binary_path\n",
    "\n",
    "        # 创建服务对象并启动浏览器\n",
    "        service = Service(executable_path=chrome_driver_path)      \n",
    "        self.driver = webdriver.Chrome(service=service, options=options)\n",
    "        self.url = \"https://www.sogou.com/\"\n",
    "        self.driver.maximize_window()\n",
    "        time.sleep(3)\n",
    "\n",
    "    def tearDown(self):\n",
    "        print(\"-----tearDown-----\")\n",
    "        self.driver.quit()\n",
    "\n",
    "    #测试用例\n",
    "    #忽略测试用例的执行\n",
    "    #@unittest.skip(\"skipping\")\n",
    "    def test_hao(self):\n",
    "        driver = self.driver\n",
    "        url = self.url\n",
    "        driver.get(url)\n",
    "        driver.find_element(By.LINK_TEXT, \"知乎\").click()\n",
    "        time.sleep(3)\n",
    "\n",
    "    def test_hbaidu(self):\n",
    "        driver = self.driver\n",
    "        url = self.url\n",
    "        driver.get(url)\n",
    "        #self.assertEqual(\"突如其来的假期_上网从搜狗开始\", driver.title, msg=\"实际结果和预期结果不一致\" )\n",
    "        self.assertTrue(\"搜狗搜索引擎 - 上网从搜狗开始\" == driver.title, msg=\"不一致！！！\")\n",
    "        driver.find_element(By.ID, \"query\").send_keys(\"突如其来的假期\")\n",
    "        driver.find_element(By.ID, \"stb\").click()\n",
    "        time.sleep(3)\n",
    "        print(driver.title)\n",
    "        self.assertEqual(driver.title, \"突如其来的假期 - 搜狗搜索\", msg=\"实际结果和预期结果不一致\" )\n",
    "        time.sleep(3)\n",
    "\n",
    "\n",
    "if __name__ == \"__main__\":\n",
    "    unittest.main(argv=['first-arg-is-ignored'], exit=False) #避免解析 Jupyter 的参数"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### 搜狗测试2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "test_haidusearch (__main__.Baidu2) ... "
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "____setUp方法\n",
      "____tearDown方法\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "FAIL\n",
      "test_hao (__main__.Baidu2) ... "
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "____setUp方法\n",
      "____tearDown方法\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "ok\n",
      "\n",
      "======================================================================\n",
      "FAIL: test_haidusearch (__main__.Baidu2)\n",
      "----------------------------------------------------------------------\n",
      "Traceback (most recent call last):\n",
      "  File \"C:\\Users\\12525\\AppData\\Local\\Temp\\ipykernel_134832\\1896458544.py\", line 42, in test_haidusearch\n",
      "    self.assertNotEqual(\"庆余年 - 搜狗搜索\", driver.title, msg=\"Equal！\")\n",
      "AssertionError: '庆余年 - 搜狗搜索' == '庆余年 - 搜狗搜索' : Equal！\n",
      "\n",
      "----------------------------------------------------------------------\n",
      "Ran 2 tests in 30.058s\n",
      "\n",
      "FAILED (failures=1)\n"
     ]
    }
   ],
   "source": [
    "class Baidu2 (unittest.TestCase) :\n",
    "    def setUp(self):\n",
    "        print(\"____setUp方法\")\n",
    "        # 指定 ChromeDriver 和 Chrome 浏览器路径\n",
    "        chrome_driver_path = \"F:/Google Chrome/chromedriver-win64/chromedriver.exe\"\n",
    "        chrome_binary_path = \"F:/Google Chrome/Google/Chrome/Application/chrome.exe\"\n",
    "\n",
    "        # 配置 Chrome 启动选项\n",
    "        options = Options()\n",
    "        options.binary_location = chrome_binary_path\n",
    "\n",
    "        # 创建服务对象并启动浏览器\n",
    "        service = Service(executable_path=chrome_driver_path)      \n",
    "        self.driver = webdriver.Chrome(service=service, options=options)\n",
    "        self.url = \"https://www.sogou.com/\"\n",
    "        self.driver.maximize_window()\n",
    "        time.sleep(3)\n",
    "\n",
    "\n",
    "    def tearDown(self):\n",
    "        print(\"____tearDown方法\")\n",
    "        self.driver.quit()\n",
    "        \n",
    "\n",
    "\n",
    "    def test_hao(self):\n",
    "        driver = self.driver\n",
    "        driver.get(self.url)\n",
    "        driver.find_element(By.LINK_TEXT, \"医疗\").click()\n",
    "        time.sleep(3)\n",
    "        self.assertTrue(\"123\" == \"123\", msg=\"not true\")\n",
    "        time.sleep(3)\n",
    "\n",
    "\n",
    "    def test_haidusearch(self):\n",
    "        driver = self.driver\n",
    "        driver.get(self.url)\n",
    "        driver.find_element(By.ID, \"query\").clear()\n",
    "        driver.find_element(By.ID, \"query\").send_keys(\"庆余年\")\n",
    "        driver.find_element(By.ID, \"stb\").click()\n",
    "        time.sleep(3)\n",
    "        self.assertNotEqual(\"庆余年 - 搜狗搜索\", driver.title, msg=\"Equal！\")\n",
    "        # self.assertTrue(\"庆余年 - 搜狗搜索\" == driver.title, msg=\"表达式不相等！\")\n",
    "        time.sleep(3)\n",
    "  \n",
    "if __name__ == \"__main__\":\n",
    "    unittest.main(argv=['first-arg-is-ignored'], exit=False, verbosity=2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "test_haidusearch (__main__.Baidu2) ... "
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "____setUp方法\n",
      "____tearDown方法\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "ok\n",
      "test_hao (__main__.Baidu2) ... "
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "____setUp方法\n",
      "____tearDown方法\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "ok\n",
      "\n",
      "----------------------------------------------------------------------\n",
      "Ran 2 tests in 33.062s\n",
      "\n",
      "OK\n"
     ]
    }
   ],
   "source": [
    "class Baidu2 (unittest.TestCase) :\n",
    "    def setUp(self):\n",
    "        print(\"____setUp方法\")\n",
    "        # 指定 ChromeDriver 和 Chrome 浏览器路径\n",
    "        chrome_driver_path = \"F:/Google Chrome/chromedriver-win64/chromedriver.exe\"\n",
    "        chrome_binary_path = \"F:/Google Chrome/Google/Chrome/Application/chrome.exe\"\n",
    "\n",
    "        # 配置 Chrome 启动选项\n",
    "        options = Options()\n",
    "        options.binary_location = chrome_binary_path\n",
    "\n",
    "        # 创建服务对象并启动浏览器\n",
    "        service = Service(executable_path=chrome_driver_path)      \n",
    "        self.driver = webdriver.Chrome(service=service, options=options)\n",
    "        self.url = \"https://www.sogou.com/\"\n",
    "        self.driver.maximize_window()\n",
    "        time.sleep(3)\n",
    "\n",
    "\n",
    "    def tearDown(self):\n",
    "        print(\"____tearDown方法\")\n",
    "        self.driver.quit()\n",
    "        \n",
    "\n",
    "\n",
    "    def test_hao(self):\n",
    "        driver = self.driver\n",
    "        driver.get(self.url)\n",
    "        driver.find_element(By.LINK_TEXT, \"医疗\").click()\n",
    "        time.sleep(3)\n",
    "        self.assertTrue(\"123\" == \"123\", msg=\"not true\")\n",
    "        time.sleep(3)\n",
    "\n",
    "\n",
    "    def test_haidusearch(self):\n",
    "        driver = self.driver\n",
    "        driver.get(self.url)\n",
    "        driver.find_element(By.ID, \"query\").clear()\n",
    "        driver.find_element(By.ID, \"query\").send_keys(\"庆余年\")\n",
    "        driver.find_element(By.ID, \"stb\").click()\n",
    "        time.sleep(3)\n",
    "        self.assertEqual(\"庆余年 - 搜狗搜索\", driver.title, msg=\"Equal！\")\n",
    "        \n",
    "        time.sleep(3)\n",
    "  \n",
    "if __name__ == \"__main__\":\n",
    "    unittest.main(argv=['first-arg-is-ignored'], exit=False, verbosity=2)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 3.组合执行"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### addTest单个"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "-----setUp-----\n",
      "-----tearDown-----\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "."
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "____setUp方法\n",
      "____tearDown方法\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "."
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "____setUp方法\n",
      "____tearDown方法\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      ".\n",
      "----------------------------------------------------------------------\n",
      "Ran 3 tests in 47.429s\n",
      "\n",
      "OK\n"
     ]
    }
   ],
   "source": [
    "from src20250820 import testbaidu2\n",
    "from src20250820 import testbaidu1\n",
    "\n",
    "def creatSuit():\n",
    "    # 要把不同的测试脚本的类中的需要执行的方法放在一个测试套件中\n",
    "    suit = unittest.TestSuite()\n",
    "    suit.addTest(testbaidu1.Baidu1(\"test_hao\"))\n",
    "    suit.addTest(testbaidu2.Baidu2(\"test_hao\"))\n",
    "    suit.addTest(testbaidu2.Baidu2(\"test_haidusearch\"))\n",
    "    return suit\n",
    "\n",
    "    \n",
    "if __name__ == \"__main__\":\n",
    "    suit = creatSuit()\n",
    "    # verbersity= 0, 1, 2\n",
    "    runner = unittest.TextTestRunner()\n",
    "    runner.run(suit)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### makeSuite（弃用）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "-----setUp-----\n",
      "-----tearDown-----\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "."
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "-----setUp-----\n",
      "突如其来的假期 - 搜狗搜索\n",
      "-----tearDown-----\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "."
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "____setUp方法\n",
      "____tearDown方法\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "."
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "____setUp方法\n",
      "____tearDown方法\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      ".\n",
      "----------------------------------------------------------------------\n",
      "Ran 4 tests in 55.174s\n",
      "\n",
      "OK\n"
     ]
    }
   ],
   "source": [
    "from src20250820 import testbaidu2\n",
    "from src20250820 import testbaidu1\n",
    "\n",
    "def creatSuit():\n",
    "\n",
    "   #把一个测试脚本中年所有的测试用例都添加到suit中\n",
    "   #makeSuit ---慢慢弃用\n",
    "    suit = unittest.TestSuite()\n",
    "    suit.addTest(unittest.makeSuite(testbaidu1.Baidu1))\n",
    "    suit.addTest(unittest.makeSuite(testbaidu2.Baidu2))\n",
    "    return suit\n",
    "\n",
    "    #四个测试用例\n",
    "if __name__ == \"__main__\":\n",
    "    suit = creatSuit()\n",
    "    runner = unittest.TextTestRunner()\n",
    "    runner.run(suit)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### TestLoader"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "-----setUp-----\n",
      "-----tearDown-----\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "."
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "-----setUp-----\n",
      "突如其来的假期 - 搜狗搜索\n",
      "-----tearDown-----\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "."
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "____setUp方法\n",
      "____tearDown方法\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "."
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "____setUp方法\n",
      "____tearDown方法\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      ".\n",
      "----------------------------------------------------------------------\n",
      "Ran 4 tests in 55.111s\n",
      "\n",
      "OK\n"
     ]
    }
   ],
   "source": [
    "import unittest\n",
    "from src20250820 import testbaidu2\n",
    "from src20250820 import testbaidu1\n",
    "\n",
    "def creatSuit():\n",
    "   \n",
    "    suit1 = unittest.TestLoader().loadTestsFromTestCase(testbaidu1.Baidu1)\n",
    "    suit2 = unittest.TestLoader().loadTestsFromTestCase(testbaidu2.Baidu2)\n",
    "    suit = unittest.TestSuite([suit1, suit2])\n",
    "    return suit\n",
    "\n",
    "    \n",
    "if __name__ == \"__main__\":\n",
    "    suit = creatSuit()\n",
    "    runner = unittest.TextTestRunner()\n",
    "    runner.run(suit)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### discover"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "-----setUp-----\n",
      "-----tearDown-----\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "."
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "-----setUp-----\n",
      "突如其来的假期 - 搜狗搜索\n",
      "-----tearDown-----\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "."
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "____setUp方法\n",
      "____tearDown方法\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "."
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "____setUp方法\n",
      "____tearDown方法\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      ".\n",
      "----------------------------------------------------------------------\n",
      "Ran 4 tests in 41.432s\n",
      "\n",
      "OK\n"
     ]
    }
   ],
   "source": [
    "\n",
    "def creatSuit():\n",
    "   \n",
    "# 可以把一个文件夹下面所有的测试脚本中的测试用例放入测试套件\n",
    "    discover = unittest.defaultTestLoader.discover(\"src20250820\", pattern=\"testbaidu*.py\", top_level_dir=None)\n",
    "    return discover\n",
    "    \n",
    "if __name__ == \"__main__\":\n",
    "    suit = creatSuit()\n",
    "    # verbersity= 0, 1, 2\n",
    "    runner = unittest.TextTestRunner()\n",
    "    runner.run(suit)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "nowdelete",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.18"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
